# 作业一、把封装的Math类中的实例方法改为静态方法, 体会一下两者的区别
class MyMath:
    # 加
    @staticmethod
    def add(x, y):
        return x + y

    # 减
    @staticmethod
    def sub(x, y):
        return x - y

    # 乘
    @staticmethod
    def mul(x, y):
        return x * y

    # 除（Float Division）
    @staticmethod
    def float_div(x, y):
        try:
            return x / y
        except ZeroDivisionError:
            print('不能用 0 做除数！！！')

    # 地板除（Floor Division）
    @staticmethod
    def floor_div(x, y):
        try:
            return x // y
        except ZeroDivisionError:
            print('不能用 0 做除数！！！')

    # 取余（Modulus）
    @staticmethod
    def mod(x, y):
        return x % y

    # 乘方（Power）
    @staticmethod
    def power(x, y):
        return x ** y

    # 开方（Square root），平方根
    @staticmethod
    def my_sqrt(x):
        from math import sqrt
        try:
            return sqrt(x)
        except ValueError:
            print('输入不合法，开平方操作只能针对正数哦！！！')


# 作业二、昨天大家将身边的事物抽象出一个类, 在此基础上添加以下功能:
# 在类中创建类属性
# 在类中创建私有属性
# 在__init__中初始化实例属性
# 在__init__中初始化实例私有属性
# 通过类方法来获取类的私有属性
# 在自己的类中实现__str__
class Animal:
    def __init__(self, name: str):
        self.name = name

    def say(self):
        pass

    def eat(self):
        print(f'{self.name}开始吃东西')


class Ox(Animal):
    func = '耕地'
    __other_func = '斗牛'

    def __init__(self, age: int, weight: float):
        super().__init__('牛')
        self.__age = age
        self.weight = weight

    @classmethod
    def get_other_func(cls):
        return cls.__other_func

    def say(self):
        print(f'{self.name}叫声：哞哞')

    def __str__(self):
        return f'{self.name}，作用是{self.func}，体重{self.weight}kg'


class Dog(Animal):
    func = '看门'
    __other_func = '宠物'

    def __init__(self, age: int, breed: str):
        super().__init__('狗')
        self.__age = age
        self.breed = breed

    @classmethod
    def get_other_func(cls):
        return cls.__other_func

    def say(self):
        print(f'{self.name}叫声：汪汪')

    def __str__(self):
        return f'{self.name}，作用是{self.func}，品种为：{self.breed}'


if __name__ == '__main__':
    print(MyMath.add(10, 3))
    print(MyMath.sub(10, 3))
    print(MyMath.mul(10, 3))
    print(MyMath.float_div(10, 3))
    print(MyMath.floor_div(10, 3))
    print(MyMath.mod(10, 3))
    print(MyMath.power(10, 3))
    print(MyMath.my_sqrt(10))
    # 创建多个 Animal 的子类实例
    ox = Ox(5, 156.7)
    dog = Dog(2, '萨摩耶')
    print(ox)
    print(dog)
